package models

import (
	"encoding/json"
	"io/ioutil"
	"os"
	"path/filepath"
	"sync"
)

// SystemConfig 代表系统配置项
type SystemConfig struct {
	ShowClaude      bool `json:"showClaude"`
	ShowPlus        bool `json:"showPlus"`
	ShowFingerprint bool `json:"showFingerprint"`
}

// DefaultSystemConfig 返回默认系统配置
func DefaultSystemConfig() SystemConfig {
	return SystemConfig{
		ShowClaude:      true,
		ShowPlus:        true,
		ShowFingerprint: true,
	}
}

// ConfigService 处理系统配置
type ConfigService struct {
	dataDir    string
	configFile string
	config     SystemConfig
	mutex      sync.RWMutex
}

// NewConfigService 创建一个新的配置服务
func NewConfigService(dataDir string) (*ConfigService, error) {
	configFile := filepath.Join(dataDir, "system_config.json")

	service := &ConfigService{
		dataDir:    dataDir,
		configFile: configFile,
		config:     DefaultSystemConfig(),
	}

	// 确保目录存在
	if err := os.MkdirAll(dataDir, 0755); err != nil {
		return nil, err
	}

	// 尝试加载配置，如果文件不存在则使用默认配置
	if _, err := os.Stat(configFile); os.IsNotExist(err) {
		// 文件不存在，保存默认配置
		if err := service.SaveConfig(service.config); err != nil {
			return nil, err
		}
	} else {
		// 文件存在，读取配置
		if err := service.loadConfig(); err != nil {
			return nil, err
		}
	}

	return service, nil
}

// GetConfig 获取当前系统配置
func (s *ConfigService) GetConfig() SystemConfig {
	s.mutex.RLock()
	defer s.mutex.RUnlock()
	return s.config
}

// UpdateConfig 更新系统配置
func (s *ConfigService) UpdateConfig(config SystemConfig) error {
	s.mutex.Lock()
	defer s.mutex.Unlock()

	s.config = config
	return s.SaveConfig(config)
}

// SaveConfig 保存配置到文件
func (s *ConfigService) SaveConfig(config SystemConfig) error {
	data, err := json.MarshalIndent(config, "", "    ")
	if err != nil {
		return err
	}

	return ioutil.WriteFile(s.configFile, data, 0644)
}

// loadConfig 从文件加载配置
func (s *ConfigService) loadConfig() error {
	data, err := ioutil.ReadFile(s.configFile)
	if err != nil {
		return err
	}

	var config SystemConfig
	if err := json.Unmarshal(data, &config); err != nil {
		return err
	}

	s.config = config
	return nil
}
